/**
 * @swagger
 * tags:
 *   name: 用户认证
 *   description: 用户认证相关的接口，包括注册、登录、获取用户信息等
 */

const express = require('express')
const { body } = require('express-validator')
const router = express.Router()
const authController = require('../controllers/authController')
const { auth } = require('../middleware/auth')
const { handleValidationErrors } = require('../middleware/validation')

// 注册验证规则
const registerValidation = [
  body('username')
    .trim()
    .isLength({ min: 3, max: 20 })
    .withMessage('用户名长度必须在3-20个字符之间')
    .matches(/^[a-zA-Z0-9_]+$/)
    .withMessage('用户名只能包含字母、数字和下划线'),
  body('password')
    .isLength({ min: 6, max: 100 }) // Added max length for password
    .withMessage('密码长度至少6个字符'),
  body('name')
    .trim()
    .isLength({ min: 1, max: 50 })
    .withMessage('姓名不能为空且不超过50个字符'),
  body('email')
    .optional({ checkFalsy: true }) // Allow empty string or null
    .trim()
    .isEmail()
    .withMessage('邮箱格式不正确')
    .normalizeEmail(),
  body('role')
    .optional()
    .isIn(['student', 'admin'])
    .withMessage("角色必须是 'student' 或 'admin'")
]

// 登录验证规则
const loginValidation = [
  body('username').notEmpty().withMessage('用户名不能为空'),
  body('password').notEmpty().withMessage('密码不能为空')
]

// 修改密码验证规则
const changePasswordValidation = [
  body('oldPassword').notEmpty().withMessage('原密码不能为空'),
  body('newPassword')
    .isLength({ min: 6, max: 100 })
    .withMessage('新密码长度至少6个字符')
]

/**
 * @swagger
 * components:
 *   schemas:
 *     UserRegister:
 *       type: object
 *       required:
 *         - username
 *         - password
 *         - name
 *       properties:
 *         username:
 *           type: string
 *           description: |
 *             用户名
 *             * 长度必须在3-20个字符之间
 *             * 只能包含字母、数字和下划线
 *             * 必须唯一
 *           minLength: 3
 *           maxLength: 20
 *           pattern: ^[a-zA-Z0-9_]+$
 *           example: "john_doe123"
 *         password:
 *           type: string
 *           description: |
 *             用户密码
 *             * 长度至少6个字符
 *             * 建议使用字母、数字和特殊字符的组合
 *           minLength: 6
 *           format: password
 *           example: "password123"
 *         name:
 *           type: string
 *           description: |
 *             用户真实姓名
 *             * 长度在1-50个字符之间
 *             * 支持中文和英文
 *           minLength: 1
 *           maxLength: 50
 *           example: "张三"
 *         email:
 *           type: string
 *           format: email
 *           description: |
 *             用户邮箱（可选字段）
 *             * 必须是有效的邮箱格式
 *           example: "zhangsan@example.com"
 *     UserLogin:
 *       type: object
 *       required:
 *         - username
 *         - password
 *       properties:
 *         username:
 *           type: string
 *           description: |
 *             登录用户名
 *             * 必填项
 *           example: "john_doe123"
 *         password:
 *           type: string
 *           description: |
 *             登录密码
 *             * 必填项
 *           format: password
 *           example: "password123"
 *     ChangePassword:
 *       type: object
 *       required:
 *         - oldPassword
 *         - newPassword
 *       properties:
 *         oldPassword:
 *           type: string
 *           description: |
 *             当前使用的密码
 *             * 必填项
 *             * 用于验证用户身份
 *           format: password
 *           example: "oldpassword123"
 *         newPassword:
 *           type: string
 *           description: |
 *             新的密码
 *             * 必填项
 *             * 长度至少6个字符
 *             * 不能与旧密码相同
 *           minLength: 6
 *           format: password
 *           example: "newpassword123"
 */

/**
 * @swagger
 * /api/auth/register:
 *   post:
 *     summary: 用户注册接口
 *     description: |
 *       注册新用户账号
 *       * 用户名必须唯一
 *       * 密码会进行加密存储
 *       * 注册成功后可以直接登录
 *     tags: [用户认证]
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             $ref: '#/components/schemas/UserRegister'
 *     responses:
 *       200:
 *         description: 注册成功
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                   description: 操作是否成功
 *                   example: true
 *                 message:
 *                   type: string
 *                   description: 注册成功的提示消息
 *                   example: "用户注册成功"
 *       400:
 *         description: |
 *           输入验证错误
 *           * 用户名格式不正确
 *           * 密码长度不够
 *           * 邮箱格式错误等
 *       409:
 *         description: |
 *           注册失败
 *           * 用户名已被占用
 */
router.post(
  '/register',
  registerValidation,
  handleValidationErrors,
  authController.register
)

/**
 * @swagger
 * /api/auth/login:
 *   post:
 *     summary: 用户登录接口
 *     description: |
 *       用户登录并获取访问令牌
 *       * 成功登录后返回 JWT token
 *       * token 需要在后续请求中通过 Authorization header 携带
 *     tags: [用户认证]
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             $ref: '#/components/schemas/UserLogin'
 *     responses:
 *       200:
 *         description: 登录成功
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 token:
 *                   type: string
 *                   description: |
 *                     JWT 访问令牌
 *                     * 有效期为24小时
 *                     * 请在请求头中携带：Authorization: Bearer <token>
 *                   example: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
 *       401:
 *         description: |
 *           登录失败
 *           * 用户名不存在
 *           * 密码错误
 */
router.post(
  '/login',
  loginValidation,
  handleValidationErrors,
  authController.login
)

/**
 * @swagger
 * /api/auth/me:
 *   get:
 *     summary: 获取当前登录用户信息
 *     description: |
 *       获取当前登录用户的详细信息
 *       * 需要在请求头中携带有效的 JWT token
 *       * 返回用户的基本信息（不包含密码）
 *     tags: [用户认证]
 *     security:
 *       - bearerAuth: []
 *     responses:
 *       200:
 *         description: 成功获取用户信息
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 id:
 *                   type: integer
 *                   description: 用户ID
 *                   example: 1
 *                 username:
 *                   type: string
 *                   description: 用户名
 *                   example: "john_doe123"
 *                 name:
 *                   type: string
 *                   description: 用户真实姓名
 *                   example: "张三"
 *                 email:
 *                   type: string
 *                   description: 用户邮箱
 *                   example: "zhangsan@example.com"
 *       401:
 *         description: |
 *           未授权访问
 *           * token 无效或已过期
 *           * 未提供 token
 */
router.get('/me', auth, authController.getCurrentUser)

/**
 * @swagger
 * /api/auth/change-password:
 *   post:
 *     summary: 修改用户密码
 *     description: |
 *       修改当前登录用户的密码
 *       * 需要验证原密码
 *       * 新密码不能与原密码相同
 *       * 修改成功后需要重新登录
 *     tags: [用户认证]
 *     security:
 *       - bearerAuth: []
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             $ref: '#/components/schemas/ChangePassword'
 *     responses:
 *       200:
 *         description: |
 *           密码修改成功
 *           * 修改成功后，当前的 token 将失效
 *           * 需要使用新密码重新登录
 *       400:
 *         description: |
 *           输入验证错误
 *           * 新密码长度不够
 *           * 新密码与原密码相同
 *       401:
 *         description: |
 *           未授权访问或验证失败
 *           * token 无效或已过期
 *           * 原密码错误
 */
router.post(
  '/change-password',
  auth,
  changePasswordValidation,
  handleValidationErrors,
  authController.changePassword
)

module.exports = router
